Uprava tipu 995 z knihy 1001 tipu a triku
Otázka od: Robert Suska
10. 10. 2002 9:02
Ahojte
Mam problem z prekreslovanim TreeView a to taky ze ten priklad co je v knihe
som odpisal a tiez nechodi korektne ako som si predstavoval totiz Canvas sa
nerekresluje dobre. Upravil som kod na moju potrebu a to tak ze potrebujem
aby sa mi polozka na ktoru sa prave kliklo zobrazila ako fsBold a vsetko
ostatne aby bolo normalne vykreslene. Ono by to aj chodilo keby sa mi boldom
nekraslila aj dalsia noda pod tou ktora sa ani vykreslit boldom nemala. A
ked aj kliknem na inu nodu tak ta co bola boldom uz nieje ale na konci
riadku je este boldom vykresleny rozdiel medzi width textu boldom aj width
textu normalnym pismom.
procedure TreeViewCustomDrawItem(Sender: TCustomTreeView; Node: TTreeNode;
State: TCustomDrawState; var DefaultDraw: Boolean);
var NodeRect: TRect;
begin
with TTreeView(Sender).Canvas do
begin
if cdsSelected in State then
begin
NodeRect:= Node.DisplayRect(True);
Font.Style:= [fsBold];
FillRect(NodeRect);
end
else
Font.Style:= []; // tu je podla knihy [fsItalic], inac ked som tam dal
aj taketo nieco Fotn.Style:= Fotn.Style - [fsBold]; ani tak to nepomohlo
end;
end;
Viete mi niekto poradit ?
Dakujem
S pozdravom,
************************************
Robert Suska
KORAK SLOVAKIA s.r.o.
Horna 52
974 01 Banska Bystrica
www.korak.sk robert@korak.sk
Network administrator, Delphi programmer
************************************
Odpovedá: Petr Vones
12. 10. 2002 22:40
From: "Robert Suska" <delphi@korak.sk>
> Mam problem z prekreslovanim TreeView a to taky ze ten priklad co je v knihe
V jake verzi Delphi ?
Petr Vones
Odpovedá: Robert Suska
13. 10. 2002 11:20
Ahoj!
> V jake verzi Delphi ?
Delphi 6 Enterprise Update Pack #2, Windows 2000 SP3 eng.
Robo
Odpovedá: Petr Vones
13. 10. 2002 16:24
From: "Robert Suska" <delphi@korak.sk>
> nerekresluje dobre. Upravil som kod na moju potrebu a to tak ze potrebujem
> aby sa mi polozka na ktoru sa prave kliklo zobrazila ako fsBold a vsetko
> ostatne aby bolo normalne vykreslene. Ono by to aj chodilo keby sa mi boldom
procedure TForm1.TreeView1CustomDrawItem(Sender: TCustomTreeView;
Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
with TTreeView(Sender) do
begin
if cdsSelected in State then
Canvas.Font.Style:= [fsBold]
else
begin
Canvas.Font.Style:= [];
Canvas.Font.OnChange(nil); // Workaround
Canvas.Brush.Color := Color;
Canvas.FillRect(Node.DisplayRect(True));
end;
end;
end;
Petr Vones
Odpovedá: Robert Suska
13. 10. 2002 19:34
Ahoj!
Dakujem uz to funguje krasne aj ked nechapem vyznam toho kodu a uvital by
som keby si mi ho trochu objasnil konkretne tieto riadky
Canvas.Font.OnChange(nil); // Workaround - toto je co ???
Canvas.Brush.Color := Color; // a := Color; to je farba coho ? akeho objektu
Dakujem
Robert Suska
> procedure TForm1.TreeView1CustomDrawItem(Sender: TCustomTreeView;
> Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
> begin
> with TTreeView(Sender) do
> begin
> if cdsSelected in State then
> Canvas.Font.Style:= [fsBold]
> else
> begin
> Canvas.Font.Style:= [];
> Canvas.Font.OnChange(nil); // Workaround
> Canvas.Brush.Color := Color;
> Canvas.FillRect(Node.DisplayRect(True));
> end;
> end;
> end;
>
> Petr Vones
Odpovedá: ing. Jan Fiala
13. 10. 2002 19:44
13.10.2002 Robert Suska:
> Dakujem uz to funguje krasne aj ked nechapem vyznam toho kodu a uvital by
> som keby si mi ho trochu objasnil konkretne tieto riadky
> Canvas.Font.OnChange(nil); // Workaround - toto je co ???
Jen vyvolas obsluhu zmeny fontu.
> Canvas.Brush.Color := Color; // a := Color; to je farba coho ? akeho objektu
To je barva objektu, se kterym prave pracujes, v tomto pripade
TreeView
--
ing. Jan Fiala
mailto:jan.fiala@iol.cz
Odpovedá: Petr Vones
13. 10. 2002 20:52
From: "Robert Suska" <delphi@korak.sk>
> Canvas.Font.OnChange(nil); // Workaround - toto je co ???
Chyba ve VCL. Pouziti TFont neni totiz v OnCustomDrawXXX udalostech to uplne
nejstastnejsi reseni. Pokud se podivas na implementaci tak zjistis, ze na
konci obsluhy zprav VCL slouzicich pro toto vykreslovani se testuje private
promenna FCanvasChanged (TTreeView, TListView). Pri kazde zmene vlastnosti
TFont je treba aby se pres udalost TFont.OnChange nastavila tato promenna na
True. Jenze TFont je puvodne navrzen k jinemu ucelu a ma i nejake vychozi
hodnoty vlastnosti a teprve jejich zmenou dojde k vyvolani teto udalosti a
tedy i nastaveni te promenne FCanvasChanged. V tom danem pripade ale zadne
vychozi hodnoty nejsou a je treba tuto udalost vyvolat pri nastaveni jakekoli
hodnoty, tedy i te "vychozi" jako je napriklad: TFont.Style := []. Workaround
prave spociva v explicitnim vyvolani te udalosti.
> Canvas.Brush.Color := Color; // a := Color; to je farba coho ? akeho objektu
TTreeView.Color
Petr Vones